package cn.lcsjsxy.yxc.objectoriented.类中代码块结构的使用;
/*
* 类的成员之四：代码块（或初始化块）
*
* 1.代码块的作用：用来初始化类、对象（初始化块）
* 2.代码块如果有修饰的话，只能使用static
* 3.分类：静态代码块 Vs 非静态代码块
*
* 4.静态代码块
*   》内部可以有输出语句
*   》随着类的加载而执行,而且只执行一次
*   》作用：初始化类的信息
*   》如果一个类中定义了多个静态代码块，则按照声明的先后顺序执行
*   》静态代码块的执行要优先于非静态代码块的执行
*   》静态代码块内只能调用静态的属性、静态的方法，不能调用非静态的结构
*
* 5.非静态代码块
*   》内部可以有输出语句
*   》随着对象的创建而执行
*   》每创建一个对象，就执行一次非静态代码块
*   》作用：可以在创建对象时，对对象的属性等进行初始化
*   》如果一个类中定义了多个非静态代码块，则按照声明的先后顺序执行
*   》非静态代码块内可以调用静态的属性、静态的方法，或非静态的属性、非静态的方法
*
* 对属性可以赋值的位置
* 1.默认初始化
* 2.显式初始化
* 3.构造器中初始化
* 4.有了对象后，可以通过“对象.属性”或“对象.方法“的方式进行赋值
* 5.在代码块中赋值
* 先后顺序：1——》2/5——》3——》4
* */
public class BlockTest {
    public static void main(String[] args) {
        String desc=Person.desc;
        Person person=new Person();
        System.out.println(person.name+"\t"+person.age);
        Person person1=new Person();
        System.out.println(person1.name+"\t"+person1.age);
    }
}

class Person{
    //属性
    String name;
    int age;
    static String desc = "人";

    //构造器
    public Person(){

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //静态代码块
    static{
        System.out.println("你好，我是疯狗，我要咬你");
    }

    //非静态代码块
    {
        System.out.println("你好，我是好狗，我不咬你");
        age=11;
        name="马牛逼";
    }

    //方法
    public void eat(){
        System.out.println("吃吃吃吃好吃");
    }

    @Override
    public String toString() {
        return "com.yang_xc.miscellaneous.Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void hello(){
        System.out.println("你好~~~~~（蜜汁微笑）");
    }
}